package com.edu.test;

import com.edu.bean.Student;
import com.edu.bean.User;
import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author:mx
 * @Date:2025/11/4-11:27:52
 */
public class MyTest4 {

    /*
    *       在Class对象中，使用 Method 这种类型的对象 来表示 一个方法的信息
    *           如何获取 某个类中的方法的信息:
    *           getMethods(); 获取当前类和其先祖的和其接口的 所有公有的方法
    *           getDeclaredMethods() 获取当前类自身所有的公有和私有的方法
    *           getMethod(String 方法名，Class...参数类型) 获取指定方法名和参数列表的公有的方法
    *           getDeclaredMethod(String 方法名，Class...参数类型) 获取指定方法名和参数列表的公有/私有的方法
    * */
    @Test
   public void test01() throws Exception {
        Class clazz = User.class;
//        Method[] methods = clazz.getMethods();
//        System.out.println(methods.length);
//        for (Method method : methods) {
//            System.out.println(method.getName());
//        }

//        Method[] methods = clazz.getDeclaredMethods();
//        System.out.println(methods.length);
        Method m1 = clazz.getMethod("sayHi");
        Method m2 = clazz.getMethod("sayHi",String.class);
        Method m3 = clazz.getMethod("sayHi",String.class,int.class);
        Method m4 = clazz.getDeclaredMethod("sayHi",String.class,int.class);
    }

    /*
    *       Method对象的常用方法
    * */

    @Test
    public void test02(){
        Class clazz = User.class;
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名字:"+method.getName());
            System.out.println("方法访问修饰符："+method.getModifiers());
            System.out.println("方法的返回值类型"+method.getReturnType());
            System.out.println("方法的参数的个数"+method.getParameterCount());
            Class[] types = method.getParameterTypes();
            for (Class type : types) {
                System.out.println("方法的参数列表:"+type);
            }
            System.out.println("--------------------------");
        }
    }


    /*
    *   Method 来调用 某个对象的 这个 方法
    *       
    * */
    @Test
    public void test03(){
        Class clazz = User.class;
        User user = new User();
        try {
            Method m1 = clazz.getMethod("sayHi");
            System.out.println(m1.invoke(user));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void test04() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class clazz = User.class;
        User user = new User();

        Method method = clazz.getDeclaredMethod("sayPrivate");
        method.setAccessible(true);
        method.invoke(user);


    }


}
